import markdownit from './markdownfn'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    buffer: '',
    htmlContent: '',
    markdownContent: '',
  },

  onLoad() {
    this.startStreamRequest()
  },
  startStreamRequest() {
    const requestTask = wx.request({
      url:
        'https://wx.t.17u.cn/airobotmiddlelayer/aichatrobot/dialog/getAIStreamAnswer',
      method: 'POST',
      responseType: 'text',
      enableChunked: true,
      data: {
        caller: 'tcwireless.search.aichatrobot.ui',
        locationCity: '226',
        nickName: '-',
        openId: 'o498X0dObhkrCtc0UwNBokVTybAMooo',
        plat: 'wechat',
        posLat: 31.26249,
        posLon: 120.63212,
        robotName: 'chengxin',
        unionId: 'ohmdTty-Z1GjTMhz2esWWxgezfRoo',
        userInput: '苏州怎么玩呢',
      },
      success: () => console.log('请求完成'),
      fail: (err) => console.error('请求失败', err),
    })

    // 分块接收数据
    requestTask.onChunkReceived((res) => {
      // console.log('res', res)
      const arrayBuffer = res.data

      const base64 = wx.arrayBufferToBase64(arrayBuffer)

      const string = this.base64_decode(base64) // 兼容性写法
      const data = JSON.parse(string.replace(/^data:/, ''))
      console.log(data)

      // const chunk = this.arrayBufferToString(res.data)
      // console.log('chunk', chunk)
      this.parseStreamChunk(data.answer) // 解析分块
    })
  },
  parseStreamChunk(content) {
    // console.log(content)
    this.data.markdownContent += content
    // this.setData({
    //   markdownContent: this.data.markdownContent + content,
    // })
    console.log('markdownContent', this.data.markdownContent)
    // 解析markdown
    this.renderMarkdown(this.data.markdownContent)
  },
  renderMarkdown(markdown) {
    const md = markdownit()
    const result = md.render(markdown)
    console.log(result)
    this.setData({
      htmlContent: result,
    })
  },

  // 在页面JS中扩展解析方法
  // parseStreamChunk(chunk) {
  //   let { buffer, htmlContent } = this.data
  //   buffer += chunk // 追加新分块到缓冲区

  //   // 按行分割处理（简化逻辑）
  //   const lines = buffer.split('\n')
  //   let newHtml = ''
  //   let isCodeBlock = false // 标记是否在代码块中

  //   for (const line of lines) {
  //     if (isCodeBlock) {
  //       if (line.trim().startsWith('```')) {
  //         newHtml += '</code></pre>' // 结束代码块
  //         isCodeBlock = false
  //       } else {
  //         newHtml += line + '\n' // 代码块内容
  //       }
  //     } else {
  //       // 解析标题
  //       if (line.startsWith('### ')) {
  //         newHtml += `<h3>${line.replace('### ', '')}</h3>`
  //       } else if (line.startsWith('## ')) {
  //         newHtml += `<h2>${line.replace('## ', '')}</h2>`
  //       } else if (line.startsWith('# ')) {
  //         newHtml += `<h1>${line.replace('# ', '')}</h1>`
  //       }
  //       // 解析代码块
  //       else if (line.trim().startsWith('```')) {
  //         newHtml += '<pre><code>'
  //         isCodeBlock = true
  //       }
  //       // 解析粗体
  //       else if (line.includes('**')) {
  //         const boldText = line.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
  //         newHtml += `<p>${boldText}</p>`
  //       }
  //       // 默认文本
  //       else {
  //         newHtml += `<p>${line}</p>`
  //       }
  //     }
  //   }

  //   // // 更新数据（防抖避免频繁渲染）
  //   // this.setData(
  //   //   {
  //   //     htmlContent: htmlContent + newHtml,
  //   //     buffer: lines[lines.length - 1], // 记录未处理完的行
  //   //   },
  //   //   () => {
  //   //     console.log('已渲染内容:', this.data.htmlContent)
  //   //   }
  //   // )
  // },

  base64_decode(input) {
    var chars =
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
    var output = ''
    var chr1, chr2, chr3
    var enc1, enc2, enc3, enc4
    var i = 0
    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '')
    while (i < input.length) {
      enc1 = chars.indexOf(input.charAt(i++))
      enc2 = chars.indexOf(input.charAt(i++))
      enc3 = chars.indexOf(input.charAt(i++))
      enc4 = chars.indexOf(input.charAt(i++))
      chr1 = (enc1 << 2) | (enc2 >> 4)
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2)
      chr3 = ((enc3 & 3) << 6) | enc4
      output = output + String.fromCharCode(chr1)
      if (enc3 != 64) {
        output = output + String.fromCharCode(chr2)
      }
      if (enc4 != 64) {
        output = output + String.fromCharCode(chr3)
      }
    }
    return this.utf8_decode(output)
  },
  utf8_decode(str) {
    var string = ''
    let i = 0
    let c = 0
    let c1 = 0
    let c2 = 0
    while (i < str.length) {
      c = str.charCodeAt(i)
      if (c < 128) {
        string += String.fromCharCode(c)
        i++
      } else if (c > 191 && c < 224) {
        c1 = str.charCodeAt(i + 1)
        string += String.fromCharCode(((c & 31) << 6) | (c1 & 63))
        i += 2
      } else {
        c1 = str.charCodeAt(i + 1)
        c2 = str.charCodeAt(i + 2)
        string += String.fromCharCode(
          ((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)
        )
        i += 3
      }
    }
    return string
  },
})
